Raziščite svet vgrajenih sistemov s Pythonom. Ta obsežen vodnik zajema MicroPython, CircuitPython, integracijo strojne opreme in projekte iz resničnega sveta za globalno občinstvo.
Python na strojni opremi: Poglobljen vpogled v vgrajeno programiranje in integracijo mikrokrmilnikov
Desetletja je bil svet vgrajenih sistemov—majhni računalniki, ki poganjajo vse od pametnih ur do industrijskih strojev—izključna domena nizkonivojskih jezikov, kot so C, C++ in Assembly. Ti jeziki nudijo neprimerljiv nadzor in zmogljivost, vendar prihajajo z visoko krivuljo učenja in dolgimi razvojnimi cikli. Vstopite v Python, jezik, ki je znan po svoji preprostosti, berljivosti in obsežnem ekosistemu. Python, nekoč omejen na spletne strežnike in znanost o podatkih, se zdaj močno prebija v srce strojne opreme ter demokratizira elektroniko za novo generacijo razvijalcev, hobistov in inovatorjev po vsem svetu.
Ta vodnik je vaš celovit uvod v vznemirljiv svet Python vgrajenega programiranja. Raziskali bomo, kako lahko visokonivojski jezik, kot je Python, neposredno nadzoruje strojno opremo, preučili ključne platforme, ki to omogočajo, in vas popeljali skozi praktične primere, da začnete svojo pot od programske opreme do silicija.
Ekosistem vgrajenega Pythona: Več kot le CPython
Standardnega Pythona, ki ga uporabljate na svojem prenosniku (znanega kot CPython), ne morete preprosto namestiti na tipičen mikrokrmilnik. Te naprave imajo izjemno omejene vire—govorimo o kilobajtih RAM-a in megahertih procesorske moči, kar je v ostrem kontrastu z gigabajti in gigaherci v sodobnem računalniku. Za premostitev te vrzel so bile ustvarjene specializirane, vitke implementacije Pythona.
MicroPython: Python za mikrokrmilnike
MicroPython je popolna predelava programskega jezika Python 3, optimizirana za delovanje na omejeni strojni opremi. Ustvaril ga je Damien George z namenom čim večje združljivosti s standardnim Pythonom, hkrati pa zagotavlja neposreden, nizkonivojski dostop do strojne opreme.
- Ključne značilnosti: Vključuje interaktivno zanko Read-Eval-Print Loop (REPL), ki vam omogoča povezavo z napravo in izvajanje kode vrstico za vrstico brez koraka prevajanja. Je zelo učinkovit, ima majhno porabo pomnilnika in ponuja zmogljive module, kot je
machine, za neposreden nadzor strojne opreme (GPIO, I2C, SPI itd.). - Najboljše za: Razvijalce, ki želijo največjo zmogljivost, natančen nadzor nad strojno opremo in združljivost z velikim številom mikrokrmilnikov. Bliže je "strojni opremi" in pogosto priljubljen za aplikacije, ki so bolj kritične glede zmogljivosti.
CircuitPython: Moč za začetnike
CircuitPython je izpeljanka MicroPythona, ki jo je ustvarilo in vzdržuje podjetje Adafruit, vodilno podjetje na področju »naredi sam« (DIY) elektronike. Čeprav si deli jedro z MicroPythonom, je njegova filozofija osredotočena na enostavnost uporabe in izobraževanje.
- Ključne značilnosti: Najpomembnejša funkcija je način, kako mikrokrmilnik predstavlja vašemu računalniku. Ko priključite napravo CircuitPython, se prikaže kot majhen USB ključek. Preprosto uredite datoteko
code.pyna tem ključku in jo shranite; naprava ponovno naloži in samodejno zažene vašo novo kodo. Ponuja tudi enoten API za vse podprte naprave, kar pomeni, da bo koda za branje senzorja na eni napravi delovala na drugi z minimalnimi spremembami. - Najboljše za: Začetnike, izobraževalce in kogar koli, ki se osredotoča na hitro prototipiranje. Krivulja učenja je blažja, obsežen ekosistem knjižnic, ki ga ponuja Adafruit, pa omogoča neverjetno enostavno integracijo senzorjev, zaslonov in drugih komponent.
MicroPython proti CircuitPython: Hitra primerjava
Izbira med njima se pogosto nanaša na vaše projektne cilje in raven izkušenj.
- Filozofija: MicroPython daje prednost funkcijam, specifičnim za strojno opremo, in zmogljivosti. CircuitPython daje prednost preprostosti, doslednosti in enostavnosti učenja.
- Delovni proces: Z MicroPythonom običajno uporabite orodje, kot je Thonny, da se povežete z REPL naprave in naložite datoteke. Z CircuitPythonom povlečete in spustite datoteko
code.pyna USB ključek. - Podpora za strojno opremo: MicroPython podpira široko paleto plošč proizvajalcev. CircuitPython v glavnem podpira plošče podjetja Adafruit in izbrane tretje osebe, vendar je njegova podpora globoka in dobro dokumentirana.
- Knjižnice: CircuitPython ima ogromen, urejen nabor knjižnic, ki jih je enostavno namestiti. Knjižnice MicroPython so na voljo, vendar so lahko bolj razdrobljene.
Za ta vodnik bodo koncepti in številni primeri kod veljavni za obe možnosti, z manjšimi spremembami. Razlike bomo opozorili, kjer so pomembne.
Izbira strojne opreme: Bojišče mikrokrmilnikov
Število mikrokrmilnikov (MCU), ki lahko izvajajo Python, je v zadnjih letih eksplodiralo. Tukaj je nekaj najbolj priljubljenih in dostopnih možnosti za globalno občinstvo.
Raspberry Pi Pico & RP2040
Da ne zamenjamo s polnopravnim računalnikom Raspberry Pi, je Pico poceni, visoko zmogljiva mikrokrmilniška plošča, zgrajena okoli čipa RP2040 po meri. Postal je globalni favorit za Python na strojni opremi.
- Ključne značilnosti: Zmogljiv dvokritični procesor ARM Cortex-M0+, velikodušnih 264 KB RAM-a in edinstvena funkcija Programmable I/O (PIO), ki omogoča ustvarjanje vmesnikov strojne opreme po meri. Novejši model Pico W dodaja vgrajeni Wi-Fi.
- Zakaj je odličen za Python: Ima uradno, prvo-razredno podporo za MicroPython in je dobro podprt tudi s CircuitPythonom. Njegova nizka cena (pogosto pod 10 USD) in močna zmogljivost ga naredijo neverjetno vrednega.
Espressif ESP32 & ESP8266
Družina čipov ESP, ki jo je izdelalo Šanghajsko podjetje Espressif Systems, so nesporni prvaki interneta stvari (IoT). Znani so po integriranih zmožnostih Wi-Fi in Bluetooth, zaradi česar so privzeta izbira za povezane projekte.
- Ključne značilnosti: Zmogljivi enojedrni ali dvokritični procesorji, vgrajeni Wi-Fi in (na ESP32) Bluetooth. Na voljo so na tisočih različnih razvojnih ploščah proizvajalcev po vsem svetu.
- Zakaj so odlični za Python: Odlična podpora za MicroPython vam omogoča gradnjo povezanih naprav z le nekaj vrsticami Python kode. Njihova procesorska moč je več kot dovolj za kompleksne naloge, kot je zagon spletnih strežnikov ali obdelava podatkov z več senzorjev.
Ekosistemi Adafruit Feather, ItsyBitsy in Trinket
Adafruit ponuja široko paleto plošč v standardiziranih oblikah. To niso specifični čipi, temveč družine izdelkov, zasnovane za brezhibno delovanje v ekosistemu CircuitPython.
- Ključne značilnosti: Plošče družine Feather imajo skupne priključke, zaradi česar so zamenljive. Mnoge vključujejo vgrajena vezja za polnjenje baterij in priključke. Na voljo so z različnimi mikrokrmilniki, vključno z RP2040, ESP32 in drugimi.
- Zakaj so odlični za Python: Zasnovani so od začetka za CircuitPython. Ta tesna integracija pomeni gladko, »plug-and-play« izkušnjo z dostopom do stotin knjižnic in vadnic.
Začetek: Vaš prvi "Zdravo, svet!" na strojni opremi
Premaknimo se od teorije k praksi. Tradicionalni "Zdravo, svet!" vgrajenega programiranja je utripanje LED diode. To preprosto dejanje potrdi, da vaša celotna orodjarna—od urejevalnika kode do vdelane programske opreme na plošči—deluje pravilno.
Predpogoji
- Podprta mikrokrmilniška plošča (npr. Raspberry Pi Pico, ESP32 ali plošča Adafruit).
- USB kabel, ki podpira prenos podatkov (ne le polnjenje).
- Računalnik (Windows, macOS ali Linux).
1. korak: Namestitev vdelane programske opreme
Vaša plošča potrebuje nameščen interpretator MicroPython ali CircuitPython. To se imenuje "bliskavica vdelane programske opreme".
- Za CircuitPython: Obiščite circuitpython.org, poiščite svojo ploščo in prenesite datoteko
.uf2. Ploščo postavite v način zagonskega nalagalnika (to običajno vključuje držanje gumba "BOOT" ali "RESET" med priključevanjem). Prikaže se kot USB ključek. Povlecite preneseno datoteko.uf2nanj. Ključek se bo izklopil in ponovno prikazal, zdaj poimenovan CIRCUITPY. - Za MicroPython: Obiščite micropython.org, poiščite svojo ploščo in prenesite datoteko vdelane programske opreme (pogosto datoteka
.uf2ali.bin). Postopek je podoben: postavite ploščo v način zagonskega nalagalnika in kopirajte datoteko.
2. korak: Nastavitev vašega urejevalnika
Čeprav lahko uporabite kateri koli urejevalnik besedil, namenski IDE olajša razvoj. Thonny IDE je zelo priporočljiv za začetnike. Je brezplačen, multiplatenfomski in ima vgrajeno podporo za MicroPython in CircuitPython. Samodejno zazna vašo ploščo, zagotovi dostop do REPL naprave in olajša nalaganje datotek.
3. korak: Koda za utripanje LED
Zdaj pa kodi. Ustvarite novo datoteko z imenom main.py za MicroPython ali uredite obstoječo code.py za CircuitPython.
Primer za MicroPython na Raspberry Pi Pico W:
import machine
import utime
# Vgrajena LED dioda na Pico W je dostopna preko posebnega imena
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("LED je utripnila!")
utime.sleep(0.5) # Počakajte pol sekunde
Primer za CircuitPython na večini plošč Adafruit:
import board
import digitalio
import time
# Vgrajena LED dioda je običajno povezana s priključkom z imenom 'LED'
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("LED je utripnila!")
time.sleep(0.5)
Razčlenitev kode:
import: Uvozimo knjižnice za nadzor strojne opreme (machine,digitalio,board) in upravljanje časa (utime,time).- Nastavitev priključka: Določimo, kateri fizični priključek želimo nadzorovati (vgrajena LED dioda) in ga konfiguriramo kot izhod.
- Zanka: Zanka
while True:teče večno. Znotraj zanke preklapljamo stanje LED diode (prižgano na izklopljeno ali izklopljeno na prižgano), natisnemo sporočilo v serijsko konzolo (vidno v Thonnyju) in nato počakamo pol sekunde.
Shranite to datoteko na svojo napravo. Vgrajena LED dioda bi se morala takoj začeti utripati. Čestitamo, pravkar ste zagnali Python neposredno na mikrokrmilniku!
Poglobljeno: Ključni koncepti Pythona na mikrokrmilnikih
Utripanje LED diode je šele začetek. Raziščimo temeljne koncepte, ki jih boste uporabili pri gradnji bolj zapletenih projektov.
Splošno Vhodno/Izhodni Vmesnik (GPIO)
GPIO priključki so fizične povezave, ki omogočajo vašemu mikrokrmilniku interakcijo s svetom. Lahko jih konfigurirate kot vhode (za branje podatkov iz gumbov ali senzorjev) ali izhode (za nadzor LED diod, motorjev ali relejev).
Branje pritiska gumba (MicroPython):
import machine
import utime
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("Gumb je pritisnjen!")
utime.sleep(0.1)
Tukaj konfiguriramo priključek 14 kot vhod z notranjim pull-down uporom. Zanka nenehno preverja, ali je vrednost gumba 1 (visoka), kar pomeni, da je bil pritisnjen.
Delo s senzorji
Večina zanimivih projektov vključuje senzorje. Python omogoča enostavno branje iz analognih in digitalnih senzorjev.
- Analogni senzorji: Ti senzorji, kot so fotoupori (merjenje svetlobe) ali potenciometri, zagotavljajo spremenljivo napetost. Analogno-digitalni pretvornik (ADC) mikrokrmilnika bere to napetost in jo pretvori v številko.
- Digitalni senzorji: Ti naprednejši senzorji (kot so senzorji temperature/vlage, merilniki pospeška) komunicirajo z uporabo specifičnih protokolov. Dva najpogostejša sta I2C (Inter-Integrated Circuit) in SPI (Serial Peripheral Interface). Ti protokoli omogočajo več napravam, da komunicirajo z mikrokrmilnikom z uporabo le nekaj priključkov. Na srečo vam redko kdaj ni treba poznati nizkonivojskih podrobnosti, saj knjižnice poskrbijo za komunikacijo namesto vas.
Branje temperature s senzorjem BMP280 (CircuitPython):
import board
import adafruit_bmp280
# Ustvari objekt vodila I2C
i2c = board.I2C() # Uporablja privzete priključke SCL in SDA
# Ustvari objekt senzorja
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# Preberi temperaturo
temperature = bmp280.temperature
print(f"Temperatura: {temperature:.2f} C")
Modulacija širine impulza (PWM)
PWM je tehnika, ki se uporablja za simulacijo analognega izhoda na digitalnem priključku. Z hitrim preklapljanjem priključka vklopljen/izklopljen lahko nadzorujete povprečno napetost, kar je uporabno za zatemnitev LED diode, nadzor hitrosti enosmernega motorja ali pozicioniranje servo motorja.
Povezljivost in internet stvari (IoT)
Tu plošče, kot sta ESP32 in Pico W, resnično blestijo. Z vgrajenim Wi-Fi omogoča Python presenetljivo enostavno gradnjo naprav IoT.
Povezovanje z Wi-Fi
Povezovanje vaše naprave z omrežjem je prvi korak. Potrebovali boste ustvariti datoteko (pogosto imenovano secrets.py v CircuitPython), da varno shranite poverilnice omrežja.
Povezovanje ESP32 z Wi-Fi (MicroPython):
import network
SSID = "VašeImeOmrežja"
PASSWORD = "VašeGesloOmrežja"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("Povezava uspešna")
print(station.ifconfig())
Izvajanje spletnih zahtevkov
Ko ste povezani, lahko komunicirate z internetom. Podatke lahko pridobite iz vmesnikov za programiranje aplikacij (API), pošljete podatke s senzorjev spletni storitvi ali sprožite spletne akcije.
Pridobivanje podatkov JSON iz API-ja (z uporabo knjižnice `urequests`):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"Trenutni čas UTC je: {data['datetime']}")
response.close()
MQTT: Jezik IoT
Medtem ko je HTTP uporaben, je zlati standard za komunikacijo IoT MQTT (Message Queuing Telemetry Transport). To je lahek protokol objavi-naroči, zasnovan za omrežja z nizko pasovno širino in visoko zakasnitvijo. Naprava lahko "objavi" podatke s senzorja na "temo", in katera koli druga naprava (ali strežnik), ki je "naročena" na to temo, bo podatke prejela takoj. To je veliko učinkoviteje kot nenehno poizvedovanje spletnega strežnika.
Napredne teme in najboljše prakse
Ko bodo vaši projekti rasli, boste naleteli na omejitve mikrokrmilnika. Tukaj je nekaj najboljših praks za pisanje robustne vgrajene Python kode.
- Upravljanje pomnilnika: RAM je vaš najdragocenejši vir. Izogibajte se ustvarjanju velikih objektov, kot so seznami ali dolgi nizi v zankah. Uporabite modul
gc(import gc; gc.collect()) za ročno sprožitev zbiranja smeti in sprostitev pomnilnika. - Upravljanje napajanja: Za naprave na baterije je energetska učinkovitost ključnega pomena. Večina mikrokrmilnikov ima način "globokega spanja" (deepsleep), ki izklopi večino čipa, porabi zelo malo energije, in se lahko zbudi po določenem času ali iz zunanjega sprožilca.
- Datotečni sistem: Datoteke lahko berete in pišete v vgrajeni pomnilnik Flash, tako kot na običajnem računalniku. To je kot nalašč za beleženje podatkov ali shranjevanje konfiguracijskih nastavitev.
- Prekinitve: Namesto nenehnega preverjanja stanja gumba v zanki (postopek, imenovan "polling"), lahko uporabite prekinitev. Zahteva za prekinitev (IRQ) je strojna signalizacija, ki ustavi glavno kodo, da zažene posebno funkcijo, nato pa nadaljuje. To je veliko učinkovitejše in bolj odzivno.
Predstavitev idej za projekte iz resničnega sveta
Pripravljeni na gradnjo? Tukaj je nekaj idej, ki združujejo koncepte, ki smo jih obravnavali:
- Pametna vremenska postaja: Uporabite ESP32 s senzorjem BME280 za merjenje temperature, vlage in tlaka. Podatke prikažite na majhnem OLED zaslonu in jih objavite preko MQTT na nadzorno ploščo, kot je Adafruit IO ali Home Assistant.
- Avtomatiziran sistem za zalivanje rastlin: Priključite senzor vlažnosti tal na Raspberry Pi Pico. Ko je zemlja suha, uporabite GPIO priključek za aktiviranje releja, ki za nekaj sekund vklopi majhno vodno črpalko.
- Prilagojena tipkovnica z makri USB: Uporabite ploščo CircuitPython, ki podpira USB HID (Human Interface Device), kot je Pico ali številne plošče Adafruit. Programirajte gumbe za pošiljanje kompleksnih bližnjic na tipkovnici ali vnašanje predhodno definiranega besedila, s čimer povečate svojo produktivnost.
Zaključek: Prihodnost je vgrajena v Python
Python je temeljito spremenil pokrajino vgrajenega razvoja. Znižal je vstopno oviro, kar omogoča razvijalcem programske opreme, da nadzorujejo strojno opremo, in inženirjem strojne opreme, da hitreje prototipirajo kot kdaj koli prej. Preprostost branja senzorja ali povezovanja z internetom z le nekaj vrsticami berljive kode je sprememba igre.
Pot od utripajoče LED diode do polno opremljene naprave IoT je izjemno nagrajujoča. Globalna skupnost in bogastvo knjižnic z odprto kodo pomenijo, da nikoli niste resnično sami, ko naletite na izziv. Torej izberite ploščo, naložite vdelano programsko opremo in začnite svojo avanturo na vznemirljivem presečišču Pythona in fizičnega sveta. Edina omejitev je vaša domišljija.